﻿function CascadeConnectionMenu(){}//初始化级联菜单的工具类构造器

CascadeConnectionMenu.prototype={
	

defaultAreaCode:"440106000",

/**判断参数是否为整数的方法**/
isNum:function(s){
    if(s!=null){
        var r,re;
        re = /\d+/i; //\d表示数字,*表示匹配多个数字
        r = s.match(re);
        return (r==s)?true:false;
    }
    return false;
},


insertOffsetArr:null,


setInsertOffset:function(){
	this.insertOffsetArr=arguments;
	return this;
},


setDefaultAreaCode:function(areaCode){
	if(this.isNum(areaCode)&&(areaCode.length>0)){//如果输入的是整字且位数正确
		this.defaultAreaCode=areaCode+"000000000".substring(0,9-areaCode.length);//补上areaCode缺的位数
	}
	return this;
},

topLevel:0,


topLevelAutoSet:true,

/**根据传入的数组（最高级地区的数组），设置topLevel属性**/
setTopLevelByArray:function(arr){
	if(!this.topLevelAutoSet)
		return;
		
	var s=arr[0][0].replace(/0+$/,'');//去掉结尾的0
	var i=s.length;
	
	if(i<=6)//如果省、市、区级别
		this.topLevel=i/2-1;
	else if(i>9)//
		this.topLevel=4;
	else//
		this.topLevel=3;
},


setTopLevel:function(inputLevel){
	
	this.topLevelAutoSet=false;
	
	if(!this.isNum(inputLevel+'')){
		alert('setTopLevel方法只接受数字类型的参数');	
		return this;
	}
	if(inputLevel>3){
		this.topLevel=3;
	}else
		this.topLevel=inputLevel;
	return this;
},
	
getElement:function(nameOrId) {
	var rs = document.getElementById(nameOrId);
	if (!rs)
		rs = document.getElementsByName(nameOrId)[0];
	return rs;
},

clearSelect:function(targetSelect){
	
	var insertOffset=0;
	
	if(targetSelect.insertOffset)//设置从select元素的第几项之后才清除option元素
		insertOffset=targetSelect.insertOffset;
	
	for (var i = targetSelect.options.length; i >= insertOffset; i--) {
		targetSelect.options[i] = null;
	}
},

InsertOptTo:function(targetSelect,areaCode,superAreaCode){
	
	var area;
	if(superAreaCode){
		area=superAreaCode;
	}else
		area=areaCode;
		
	var matchSuperAreaCode = false;//为真，则表明superAreaCode能匹配到地区
	
	if(targetSelect.insertOffset){//如果有设置从第几项插入
		if(area.length<4){//如果上级菜单非地区
			targetSelect.value=targetSelect.options[0].value;
			targetSelect.style.display='none';
			return matchSuperAreaCode;
		}else{
			targetSelect.style.display=targetSelect.oldDisplay;
		}
	}
	
	var dataArray=targetSelect.dataArray;//拥有自己要显示内容的数组
	var lastIndex=targetSelect.level;//截取地区码到lastIndex－1
	if(lastIndex==8)
		lastIndex=9;//则截取前9位
	

	var regExs;//用于判断地区是否匹配的正则表达式
	
	if(superAreaCode){
		
		if(lastIndex<6)
			regExs=area.substring(0, lastIndex+2)+"\\w*";
			
		else if(lastIndex==6){
				if(area.length<10)
					regExs=area+"\\w*";
				else//如果area地区码升级超过9位则截取前9位
					regExs=area.substring(0, 9)+"\\w*";
					
		}else{
			regExs="^("+area+")$";
		}
	}
	
	for (var i = 0; i < dataArray.length; i++) {
		
		if (lastIndex>0&&(area.substring(0, lastIndex)
			!= dataArray[i][0].substring(0, lastIndex))) {//如果地区不匹配则返回（lastIndex=0表示为省，则全部显示）
			continue;
		}
		
		opt = document.createElement("option");
		opt.value = dataArray[i][0];
		opt.text = dataArray[i][1];
		
        
         try{
         	targetSelect.add(opt,null);//非IE浏览器的add方法，有两个参数
         }
         catch(e){
         	targetSelect.add(opt);//IE浏览器的add方法，只有一个参数
         }
         
         if(regExs&&dataArray[i][0].match(regExs)){//如果需要设置默认显示的地区并且能匹配到
         	opt.selected = true;
         	delete(regExs);//把正则表达式删除，之后就不用再判断了
         	matchSuperAreaCode=true;
         }
         
         //如果是列表中含东莞区或者中山区，则把当前列表隐藏起来
         if(targetSelect.level==4&&(dataArray[i][0]=='441900000'||dataArray[i][0]=='442000000')){
         	targetSelect.value=dataArray[i][0];
         }
	}//end for
	
	this.hideSelect(targetSelect);//如果targetSelect元素为市一级,且是东莞区或者中山区则把它隐藏起来
	
	return matchSuperAreaCode;
},

cascadeInitSelect:function( targetSelect,//要初始化的目标select元素
							areaCode,//上级地区的select元素传过来的地区码
							superAreaCode){//如果有此参数，则上一参数作废，已本参数为准
	try{
		
	if(!targetSelect)//如果没有被操作的对象，则返回。作为递归调用的结束条件。
		return;
								
	/**为目标select元素删除旧选项**/
	this.clearSelect(targetSelect);
	
	/**为目标select元素创建新选项**/
	var matchSuperAreaCode = this.InsertOptTo(targetSelect,areaCode,superAreaCode);
	//matchSuperAreaCode为真，则表明superAreaCode能匹配到地区,如果匹配不到
	if(!matchSuperAreaCode) superAreaCode=null;
	
	 //如果是列表中含东莞区或者中山区，则把当前列表隐藏起来
     if(targetSelect.level==4&&(targetSelect.value=='441900000'||targetSelect.value=='442000000')){
     	targetSelect.style.display='none';
     }
	
	/**递归调用本方法，直至更新了所有的select元素**/
	//如果下级的select元素存在，则第归调用本方法直至没有下级的select元素存在
	if(superAreaCode)
		this.cascadeInitSelect(targetSelect.targetSelect,areaCode,superAreaCode);
	else
		this.cascadeInitSelect(targetSelect.targetSelect,targetSelect.value,superAreaCode);
	
	}catch(e){
		alert('Error from method "cascadeInitSelect":'+e);
	}
	
},

/**如果targetSelect元素为市一级,且是东莞区或者中山区则把它隐藏起来**/
hideSelect:function(targetSelect){
					
	/**如果本select元素为市一级**/
	if(targetSelect.targetSelect){
		if(targetSelect.level==2){
			//如果是东莞区或者中山区则把它隐藏起来
			if(targetSelect.value=='441900000'||targetSelect.value=='442000000'){
				if(!targetSelect.targetSelect.hasOldDisplay){
					targetSelect.targetSelect.oldDisplay = targetSelect.targetSelect.style.display;//把旧的显示样式保存起来
					targetSelect.targetSelect.hasOldDisplay=true;
				}
				targetSelect.targetSelect.style.display='none';
			}else if(targetSelect.targetSelect.style.display=='none'){//否则让它显示出来
				targetSelect.targetSelect.style.display=targetSelect.targetSelect.oldDisplay;
			}
		}
	}
},


initByArray:function( 			selectEleName0,//内容为省的select元素的name（字符串）或id值
								areaArray0,//内容为所有省的数组对象
								selectEleName1,//内容为市的select元素的name（字符串）或id值
								areaArray1,//内容为所有市的数组对象
								selectEleName2,//内容为区的select元素的name（字符串）或id值
								areaArray2,//内容为所有区的数组对象
								selectEleName3,//内容为镇的select元素的name（字符串）或id值
								areaArray3){//内容为所有镇的数组对象

try{									
	
	
	this.setTopLevelByArray(arguments[1]);//根据传入的数组（最高级地区的数组），设置topLevel属性
	
	var selectEle;//用于保存目标select元素
	
	for(var i=0;;){
		
		selectEle=this.getElement(arguments[i]);//获得目标select元素
		selectEle.level=this.topLevel*2+i;//此select元素的地区级别，level属性用于匹配地区码，如果为0即为省级，则不用匹配
		selectEle.dataArray=arguments[i+1];//拥有此select元素要显示内容的数组
		selectEle.cascadeConnectionMenu=this;//让此select元素持有一个初始化级联菜单的工具类对象
		selectEle.oldDisplay = selectEle.style.display;//把select元素的display属性显示出来
		
		if(this.insertOffsetArr)//如果有设置从select元素的第几项之后插入option元素
			selectEle.insertOffset=this.insertOffsetArr[i/2];
		
		i+=2;
		
		if(this.getElement(arguments[i])){//如果下级的select元素存在
			selectEle.targetSelect=this.getElement(arguments[i]);//持有下级的select元素的引用
		}else//没有下级的select元素存在则退出循环
			break;
	}
	

	this.cascadeInitSelect( this.getElement(arguments[0]),//要初始化的目标select元素
							null,//此参数为在select元素的onchange事件中使用，这里用不上
							this.defaultAreaCode);//如果有此参数，则上一参数作废，以本参数为准
	
	/**
	 * 3.为各select元素绑定能级联更新各级联菜单内容的onchange方法
	 */						
	for(i=0;i<arguments.length-2;i+=2){
		
		selectEle=this.getElement(arguments[i]);//获得目标select元素
		selectEle.onchange=function(){
			this.cascadeConnectionMenu.hideSelect(this);//如果targetSelect元素为市一级,且是东莞区或者中山区则把它隐藏起来
			this.cascadeConnectionMenu.cascadeInitSelect( 
			this.targetSelect,//要初始化的目标select元素
			this.value);//select元素的当前前（为地区码）
		}
	}
							
	}catch(e){
		alert('Error from method "initByArray":'+e);
	}
 }

}
